/*
 * Salmane y Alberto: Este es la clase que manejara el formulario de creacion/modificacion
 * de un paciente. Sera utilizada directamente por la clase
 * GestionPacienteAction (principalmente por sus dos alias "CrearPaciente"
 * y "ModificarPaciente")
 */
package infb.forms;

import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.servlet.http.HttpServletRequest;

import org.apache.struts.action.ActionErrors;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.ActionMessage;
import org.apache.struts.upload.FormFile;

public class SetPacientesForm extends org.apache.struts.action.ActionForm {

    private String tarjetaSanitaria_;
    private String identificacion_;
    private String nombre_;
    private String apellido1_;
    private String apellido2_;
    private String mail_;
    private String fecha_nacimiento_;
    private String sexo_;
    private String grupo_sanguineo_;
    private String direccion_;
    private String localidad_;
    private String provincia_;
    private String altura_;
    private String peso_;
    private String observaciones_;
    private String telefono_;
    private String password_;
    private String medico_;
    private FormFile  foto_;

    public String getAltura() {
        return this.altura_;
    }

    public String getApellido1() {
        return this.apellido1_;
    }

    public String getApellido2() {
        return this.apellido2_;
    }

    public String getDireccion() {
        return this.direccion_;
    }

    public String getFechaNacimiento() {
        return this.fecha_nacimiento_;
    }

    public String getTelefono() {
        return this.telefono_;
    }

    public String getGrupoSanguineo() {
        return this.grupo_sanguineo_;
    }

    public String getIdentificacion() {
        return this.identificacion_;
    }

    public String getLocalidad() {
        return this.localidad_;
    }

    public String getMail() {
        return this.mail_;
    }

    public String getNombre() {
        return this.nombre_;
    }

    public String getObservaciones() {
        return this.observaciones_;
    }

    public String getPeso() {
        return this.peso_;
    }

    public String getProvincia() {
        return this.provincia_;
    }

    public String getSexo() {
        return this.sexo_;
    }

    public String getTarjetaSanitaria() {
        return this.tarjetaSanitaria_;
    }

    public String getPassword() {
        return this.password_;
    }

    public String getMedico() {
        return this.medico_;
    }

    public FormFile getFoto() {
        return foto_;
    }

    public void setAltura(String altura_) {
        this.altura_ = altura_;
    }

    public void setApellido1(String apellido1) {
        this.apellido1_ = apellido1;
    }

    public void setApellido2(String apellido2) {
        this.apellido2_ = apellido2;
    }

    public void setDireccion(String direccion) {
        this.direccion_ = direccion;
    }

    public void setFechaNacimiento(String fechaNacimiento) {
        this.fecha_nacimiento_ = fechaNacimiento;
    }

    public void setTelefono(String telefono) {
        this.telefono_ = telefono;
    }

    public void setGrupoSanguineo(String grupoSanguineo) {
        this.grupo_sanguineo_ = grupoSanguineo;
    }

    public void setIdentificacion(String identificacion) {
        this.identificacion_ = identificacion;
    }

    public void setLocalidad(String localidad) {
        this.localidad_ = localidad;
    }

    public void setMail(String mail) {
        this.mail_ = mail;
    }

    public void setNombre(String nombre) {
        this.nombre_ = nombre;
    }

    public void setObservaciones(String observaciones) {
        this.observaciones_ = observaciones;
    }

    public void setPeso(String peso) {
        this.peso_ = peso;
    }

    public void setProvincia(String provincia) {
        this.provincia_ = provincia;
    }

    public void setSexo(String sexo) {
        this.sexo_ = sexo;
    }

    public void setTarjetaSanitaria(String tarjetaSanitaria) {
        this.tarjetaSanitaria_ = tarjetaSanitaria;
    }

    public void setPassword(String password) {
        this.password_ = password;
    }

    public void setMedico(String medico) {
        this.medico_ = medico;
    }

    public void setFoto(FormFile foto) {
        this.foto_ = foto;
    }

    /*
     * Metodo privado para comprobar si un String es un numero
     */
   private boolean esNumero(String cadena) {
        try {
            Integer.parseInt(cadena);
            return true;
        } catch (NumberFormatException nfe) {
            return false;
        }
    }

    /*
     * Metodo privado para comprobar que el telefono introducido
     * es valido (solo comprobamos que este entre 100000000 y 999999999).
     */
    private boolean numTelefonoValido(String telefono) {
        return (this.esNumero(telefono) && telefono.length() == 9);
    }

    /*
     * Metodo privado para comprobar que el mail tiene formato correco
     * (solo comprobamos que tenga formato nombre@servidor.dominio).
     */
   private boolean mailValido(String mail) {
        boolean cumplePatron = Pattern.matches("\\w++@\\w++\\.\\w++", mail);
        return cumplePatron;
    }

    /*
     * Metodo privado para comprobar que el nif introducido
     * es valido (ya sea un nif o un nie).
     * Se utilizara el algoritmo matematico ya conocido
     */
    private boolean nifValido(String nif) {
        if (nif.startsWith("x") || nif.startsWith("X")) {
            nif = nif.substring(1);
        }
        Pattern patron = Pattern.compile("(\\d{1,8})([TRWAGMYFPDXBNJZSQVHLCKEtrwagmyfpdxbnjzsqvhlcke])");
        Matcher m = patron.matcher(nif);
        if (m.matches()) {
            String letra = m.group(2);
            String letras = "TRWAGMYFPDXBNJZSQVHLCKE";
            int dni = Integer.parseInt(m.group(1));
            dni = dni % 23;
            String referencia = letras.substring(dni, dni + 1);
            if (referencia.equalsIgnoreCase(letra)) {
                return true;
            } else {
                return false;
            }
        } else {
            return false;
        }
    }

    /*
     * Metodo privado para comprobar que la foto tiene formato correcto
     * (comprobamos si el tipo de archivo elegido es una imagen).
     */
    private boolean fotoValida(String tipoArchivo) {
        return tipoArchivo.startsWith("image");
    }

    /*
     * Metodo para validar la entrada del usuario. Se invoca automaticamente
     * por el mecanismo interno de Struts
     */
    @Override
    public ActionErrors validate(ActionMapping mapping, HttpServletRequest peticion) {
        // creacion de un objeto ActionErrors en blanco
        ActionErrors errores = new ActionErrors();

        // la comparacion a null da problemas (nunca entra en el if)
        // por eso sospeche que la variable tuviese algun valor que no
        // fuese null. Es extraño pero de esta forma ya funciona

       if (this.tarjetaSanitaria_.equalsIgnoreCase("")|| (this.tarjetaSanitaria_==null)) {
            errores.add("tarjetaSanitaria", new ActionMessage("formularios.set_pacientes.errores.tarjeta_sanitaria.vacio"));
        }

        if (this.nombre_.equalsIgnoreCase("")||(this.nombre_==null)) {
            errores.add("nombre", new ActionMessage("formularios.set_pacientes.errores.nombre.vacio"));
        }

        if (this.apellido1_.equalsIgnoreCase("")||(this.apellido1_==null)) {
            errores.add("apellido1", new ActionMessage("formularios.set_pacientes.errores.apellido1.vacio"));
        }

      if (this.identificacion_.equalsIgnoreCase("")||(this.identificacion_==null)) {
            errores.add("identificacion", new ActionMessage("formularios.set_pacientes.errores.identificacion.vacio"));
        } 

        if (!(this.telefono_.equalsIgnoreCase("")) && !(this.telefono_ == null)) {
            if (!numTelefonoValido(this.telefono_)) {
                errores.add("telefono", new ActionMessage("formularios.set_pacientes.errores.telefono.invalido"));
            }
        }

         if (!(this.mail_.equalsIgnoreCase("")) && !(this.mail_ == null)) {
            if (!mailValido(this.mail_)) {
                errores.add("mail", new ActionMessage("formularios.set_pacientes.errores.mail.invalido"));
            }
        }
        if (this.password_.equalsIgnoreCase("")||(this.password_==null)) {
            errores.add("password", new ActionMessage("formularios.set_pacientes.errores.password.vacio"));
        }

        if((this.foto_.getFileSize()!= 0)){
            if(!fotoValida(this.foto_.getContentType())){
                    errores.add("foto",new ActionMessage("formularios.set_pacientes.errores.foto.invalido"));
            }
        }

        return errores;
    }
}

